#pragma once

#include <string>
#include <functional>
#include <vector>
#include <unordered_map>
#include <memory>
#include <cstdint>
#include <type_traits>
#include "viml/value_fwd.h"
#include "viml/object.h"
#include "viml/value.h"

namespace viml {

/**
 * 字符串对象
 */
class StringObject : public Object {
private:
    std::string data;

public:
    explicit StringObject(const std::string& s) : Object(ObjectHeader::Type::STRING), data(s) {}
    explicit StringObject(const char* s) : Object(ObjectHeader::Type::STRING), data(s) {}

    const std::string& get_data() const { return data; }
    void set_data(const std::string& s) { data = s; }

    // 实现基类的纯虚函数
    void cleanup() override {
        // 字符串特定的清理逻辑
        do_cleanup();
    }

protected:
    void do_cleanup() override {
        // 字符串清理实现
    }
};

/**
 * 列表对象
 */
class ListObject : public Object {
private:
    // 元素存储（实现在源文件中）
    void* elements_;

public:
    ListObject();
    ~ListObject();

    std::vector<Value>& get_elements();
    const std::vector<Value>& get_elements() const;

    void add_element(const Value& value);
    size_t size() const;
    Value get(size_t index) const;

    // 实现基类的纯虚函数
    void cleanup() override {
        do_cleanup();
    }

protected:
    void do_cleanup() override;
};

/**
 * 字典对象
 */
class DictObject : public Object {
private:
    // 条目存储（实现在源文件中）
    void* entries_;

public:
    DictObject();
    ~DictObject();

    std::unordered_map<std::string, Value>& get_entries();
    const std::unordered_map<std::string, Value>& get_entries() const;

    void set_entry(const std::string& key, const Value& value);
    bool has_entry(const std::string& key) const;
    size_t size() const;

    // 实现基类的纯虚函数
    void cleanup() override {
        do_cleanup();
    }

protected:
    void do_cleanup() override;
};

/**
 * 内建函数对象
 */
class BuiltinFunctionObject : public Object {
private:
    std::string name_;
    std::function<Value(const std::vector<Value>&)> function_;

public:
    BuiltinFunctionObject(const std::string& name, std::function<Value(const std::vector<Value>&)> func)
        : Object(ObjectHeader::Type::BUILTIN), name_(name), function_(std::move(func)) {}

    const std::string& get_name() const { return name_; }
    const std::function<Value(const std::vector<Value>&)>& get_function() const { return function_; }

    // 实现基类的纯虚函数
    void cleanup() override {
        do_cleanup();
    }

protected:
    void do_cleanup() override {
        // 内建函数清理实现
    }
};

} // namespace viml